package io;

import org.junit.Test;
import org.omg.CORBA.portable.InputStream;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流： BufferedOutputStream 缓冲输出流  写     bos.txt
 *        BufferedInputStream 缓冲输入流    读入
 */

public class IOSAPI {
    /**
     * 缓冲输入流：具备功能：合理传输数据 效率提高
     * 构造器具备：添加字符集；UTF8万国码
     * new BufferedOutPutStream(低级流引用，“size:存字节数组【指定】”)
     * 问题1：不能指定字符集
     * 问题2：不能按照字符读取
     */
    @Test
    public void testBIS() throws FileNotFoundException {
//        //创建低级流
//        FileInputStream fis=new FileInputStream("bos.txt");
//        //创建高级流---指定字符集---缓冲不具备功能----新【转换流】
//        BufferedOutputStream bos=new BufferedOutputStream(fis);
//        /**
//         *  read()----读:一个字节，字节数组---->专门读文字
//         */
//        bos.read();

    }

    /**
     * 高级流
     * 针对于缓冲输出/入功能限定-----传输：文本
     * <p>
     * 字符流【转换流】---解决：缓冲输入流读取单位  为字节问题
     * InputStreamReader  读取单位：字符
     * OutputStreamWriter  写出单位：字符  调用字符串getByte写出文本
     * 需求：重新写流---针对：文字   写出文本：osw.txt
     */
    @Test
    public void testOSW() throws IOException {
        //标准流：1.置空流
        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        try {
            //创建低级流
            fos = new FileOutputStream("osw.txt");
            //不考虑效率---只传输文本---字符输出流；输出单位字符形式
            //字符流：都可以在构造器第二个参数指定编码集
            osw = new OutputStreamWriter(fos, "UTF8");
            //write()  直接写出文本【不需要将文本转换成字节数组】
            osw.write("梦为努力浇了水");
            osw.write("爱往前推\n");//换行：字符char
            osw.write("当我抬起头才发觉");
        }catch (FileNotFoundException e){//文件不存在
            e.printStackTrace();
        }catch (UnsupportedOperationException e){//字符集转换异常
            e.printStackTrace();
        }catch (IOException e){//IO流异常：所有传输失败总异常
            e.printStackTrace();
        }finally {
            //关闭高级流：字符输出流
            if(osw!=null)
                try {
                    osw.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
        }
    }

/** 高级流【处理流】---转换流【字符流】，特点：套在低级流上，被其他的高级流套上【传输单位：字符】
 * 字符输入流  ---  单元测试：testISR（） 读入  文本【字符串？】
 * 字符输出流  ---  单元测试：testOSW（） 写出  文本【字符串】
 * InputStreamReader  字符输入流
 *
 * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入，写出都是字符形式
 * BufferedReader   缓冲字符输入流---解决：InputStreamReader读入字节形式
 *                                      BufferedReader读入字符形式
 * BufferedWriter
 *
 * 需求：ISR字符输入流读取 osw.txt  文件
 *      ①当前代码转换为标准流IO：捕获所有异常
 *      读取每行文本 readLine()  提示： 不为null代表文本写出
 *      写出：给老铁来个双击  666   草靠：CV复制粘贴
 *      777
 *
 */
@Test
public void testISR() throws IOException {
    //创建低级流
    FileInputStream fis=new FileInputStream("osw.txt");
    //创建高级流---转换流---字符输入流
    InputStreamReader isr=new InputStreamReader(fis);
    //读  read（）  问题：读入数据单位：字节，而不是字符，读字符
    //                  转换流---套高级流：缓冲字符输入/出流
    //创建高级流---针对转换流中：字符输入流无法读取形式：字符的情况--缓冲字符输入流
    BufferedReader br=new BufferedReader(isr);
    /** BufferedReader类
     * readLine（） 读入若干字符串，直到读到没有换行符为止
     */
    //接受输出字符串
    String line=null;
    // 判断条件：文本中一直有内容，一直读  一行文本
    while((line=br.readLine())!=null){
        System.out.println("打印读到字符串："+line);
    }


}
    /**
     * 作业2：读取ISOAPI.java文件---所有代码---写出控制台
     */
    @Test
    public void testHomeWork2() throws IOException {
        FileInputStream f = null;
        InputStreamReader i = null;
        //1.创建低级流---读入--找IOSAPI.java  代表路径：File.separator
//路径：src\main\java\com\tedu\api\io\IOSAPI.java
        f = new FileInputStream("src"
                + File.separator + "main"
                + File.separator + "java"
                + File.separator + "com"
                + File.separator + "tedu"
                + File.separator + "api"
                + File.separator + "io"
                + File.separator + "IOSAPI.java");
//2.创建高级流---读入内容是文本---转换流--无法读取文本【int】
        InputStreamReader isr = new InputStreamReader(f);
//3.创建高级流---缓冲输入流---读取文本
        BufferedReader br = new BufferedReader(i);
//4.创建变量：字符串类型--保存每次读取的一行文本
        String line = null; //null代表没有内容【等同于换行】
//5.一直读入：每行文本保存line中，如果line不为null，一直读
        while ((line = br.readLine()) != null) {
            System.out.println("打印读到字符串：" + line);
        }

//6.关闭高级流
        try {
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}